He estado trabajando con algún middleware de validación que me gustaría ampliar para permitir tanto las clases (cualquiera) como las matrices (cualquiera []) como entrada. El tipo de clase se usa como un parámetro de entrada, y he podido cambiar con éxito la función para aceptar tipos de matriz también. El problema surge cuando intento permitir ambos tipos y alimentar la entrada a la función. Como sigue
import { plainToClass } from 'class-transformer'; import { validate, ValidationError } from 'class-validator'; const validateType = ( type: any | any[], value: string, ): void => { validate(plainToClass(type, value), { }).then((errors: ValidationError[]) => { if (errors.length > 0) { console.log(`Errors found`); } else { console.log(`Success`); } });Esta función compilará si doy una clase como entrada, pero falla cuando le doy una matriz;
class CreateObjectDto { public a: string; public b: string; } const inputString = "{a: \"something\", b: \"else\"}" const inputArray = "[{a: \"something\", b: \"else\"}, {a: \"another\", b: \"more\"}]" validateType(CreateObjectDto, inputString); // pass validateType(CreateObjectDto, inputArray); // failSi modifico la función, solo acepto matrices (tipo: any[]), la función tiene éxito cuando se ejecuta. No he podido encontrar una forma de escribir el tipo de entrada como una matriz para permitir que la función acepte ambos tipos de datos.
¿Cuál sería la forma de declarar CreateObjectDto[] como parámetro de entrada a la función? ¿O cómo puedo cambiar la firma de la función para permitirle determinar con éxito si la cadena de entrada contiene un tipo o una matriz de tipos?
Gracias.
Si necesita una firma de función que tome any o any[] entonces debe escribir una implementación que discrimine el tipo y maneje el argumento de manera adecuada de esta manera:
function validateType( type: any | any[], value: string, ): void { if (type instanceof Array) { type // any[] } else { type // any } }